<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/%E8%BF%AA.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/%E8%BF%AA.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">
  <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"zhengyidi.github.io","root":"/","scheme":"Pisces","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":true,"show_result":"flat","style":null},"back2top":{"enable":true,"sidebar":true,"scrollpercent":true},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":true,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
  </script>

  <meta name="description" content="设计模式 - 结构型 - 装饰器模式">
<meta property="og:type" content="article">
<meta property="og:title" content="14.装饰器模式">
<meta property="og:url" content="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/14.%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8F/index.html">
<meta property="og:site_name" content="Zhengyidi&#96;s 学习记录">
<meta property="og:description" content="设计模式 - 结构型 - 装饰器模式">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2021-07-11T00:00:00.000Z">
<meta property="article:modified_time" content="2021-11-13T14:58:22.506Z">
<meta property="article:author" content="zhengyidi">
<meta property="article:tag" content="设计模式">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/14.%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8F/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>14.装饰器模式 | Zhengyidi`s 学习记录</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="Zhengyidi`s 学习记录" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">Zhengyidi`s 学习记录</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">休对故人思故国，且将新火试新茶。诗酒趁年华。</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>首页</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="fa fa-fw fa-tags"></i>标签</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="fa fa-fw fa-th"></i>分类</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/14.%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="zhengyidi">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Zhengyidi`s 学习记录">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          14.装饰器模式
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2021-07-11 00:00:00" itemprop="dateCreated datePublished" datetime="2021-07-11T00:00:00+00:00">2021-07-11</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2021-11-13 14:58:22" itemprop="dateModified" datetime="2021-11-13T14:58:22+00:00">2021-11-13</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" itemprop="url" rel="index"><span itemprop="name">设计模式</span></a>
                </span>
            </span>

          
            <div class="post-description">设计模式 - 结构型 - 装饰器模式</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
  <script id="hbeData" type="hbeData" data-hmacdigest="7d2753a6979a5b4834179aea46592cb93b7749bbf7549570fec37414921622fa">22064b17c03cb0c0e58c99349b6889d0b31470871e725085fde7c8feed9af7efe7e2bb7238afcd34e5e07bf2458e55c0ad4fc14499ae774de7a2c675622b5fca0f6ef8900f6e03d8e50229c8f21440805fa5ca841374cf518d23eb29b2009cf195521917fcf4fe1523825d2e5f26f1ee402e466af3e3a37e95b2c0d0e8426513432d6390c39e7240dacbed28f3f6d03b7512c887199dd20c863e6cb8b5caec99766bf5e285d72d82438652445a5b8941171f7a0a3596dfa2d2dd05dc732a99ef073e3abaa793d4a4d0eba8aac1d2c61eef231a2f4740b58d1d158dd43c7b644de7f533344da869162e88e2088cb2ce489ca2d5366c6a56b47da3ee2163a44eff9928ae256170b654c860e54a7617b0d19db6934ae05a92ff4e59e939eeab2f6a72e74a723d3855846a5dbf1da31646589128e3aea03e17c2070506086b5a131005a606dbb6e59b3112670331ca6c27e4625d6b2f409c0d02fc91b4426494f901f157a623e5ababb32519923b64735e62c90f10693b8f258f7ba1ab7e9d6b6cb88d93a19b9447353f3961f77c0a57ff28d9382d3ffcf19e5d3785894c72aeac754648a58e7625bb651d12eb070654d0f97b077f5edfdecd23a2422786ab4ac51c67dfea83701ed493572acd1ba212002bec51b5dfd7f6e3d27f0a9c614efb7bc9f264e7db14bc56a005cf00069af6711330be3404eafa72cbd5efc913babfb765b888f11957a91c4ba253a4afd0d23cf1713f73ed18650429499535262e563815a13aabaa7279ea0ceb9ca35938215e599a96b398dd06fa546205c472bb317d5325cf3f29c8aa8a36d3eed047a80de2c6861289064e0c477ecf3765588b678ee40f38015fcf589c257dcf2e01e7926ef49ebb38044e0a1e7a7cd34d4c9ef6518ea5dc15f7302d178938904a02b9c15ba690e4d29638fa3a536050d04a56946ab6930278da9de201c0107499d59eb09edc731ee8c64ecc576205b9ea4d651aefe2a96478e4343ca3544fe83c412049eda2d1797c9705518a9565148b503227214d6e5b8f7a46fb3d9533af72bad15f4b8c0f0dedee802aba3b5bae8939ee9a0c880c4915c222902dee6e605e64422e93eec6f911a5c47da6a6aed1c41c3f6b8b97c21bd261569f027fdadbb9e7e522db985d5f176076b188ae702e62112dd90a6041ee8762b30455757e5daaa91288a2885d65f9c5798ca0f9e18fd29471f692323d732a66597d298caefd776ffbea6330ab64c6f0d44365ebb5e46d8124813179e50766a848eee5a0ff3206b40250dd8aba1fee3843ed79cf55226c1c8dcac810588aa0b8baa8c0881a0f069a72daae665673d14dd98bac6bad89d003541dc5f9effd0bc3e88e8fb0bf76bd592aa6e7b556d6897feccbc5b6206ee39c60b7b0b45ce4b1c0baeb7deac59ce1f796da12eaae0c602cebdc2f97f2d2511b37723c608d06b5c20964cd23ec74d45db0d564bac82fb1149e8735423af13b9ac0b149a8345682bed7896cccb962bacbc0a7c55732260be82fbbbe270c27f75f601e918587b46286101815380dfbb822bfce25986432d1b5ab85072ee49b4d699f90e1217c95d43d8c3f2d3886c2c8c8fdf010e255d2c2b633b2c19855a01b31a509a2b10d1a0a75503498dd90a8ff8ddaec6f00e1db46348cff632d49d0052be4dceeff0bd39d6f91a406497d95e7ccdd07e79baa1e27738b78b57131c6875702af4bd3e873ec96d0c74292b3e2f2586f1ad7419bf350248b5e046572bfa631bbe008fa9553e9c192c27efe3be591c72c1ee85724e56aac655efcd6e91c3ae0074bfc15745b227a038169ac17b6c31d86ccf03c0e020999ef400707e3e0e073cfb97d1b5c43a7a362e82675e13e13d70a9fc0df505c3640e46fa52ffedbe09da7e1238d11706a3ba3ff4fc7f4035bf3d64689e052c96080b453d22e17cb249e6f9ada0790da005c5baae6ad2b71f03db7cdabf3dca445ce1bd1048b3c7002a9285c15c39b53dd72f7744be287eab86cc372e4f6b5216fb55daf365d0c7be7c187d59d084ca1c57091672eb5997e80f4acbf2e7048fb0e846ad28ca5c1ff291a9f51569ca17c55677e49d8cc9adc307eb0c4324ff2cec794b5d8c467c76552daa0c594dfcf77fe1ba9123e8858a5ff8b6d984679491a5ccb7db21e22ffaaa182ddb2db83dcb8e28d33f799a677d6b390c3705ee02ed265a22f06c1d44c6893280d789b5e1a4be6bb2c80829b75e1325f4c67606a538406a88712a8ffb970c50f45dc62dc5ea9ffe8f86516b37c97f5e494b9b4575db0d44a07602267ebe51633e3a94995a551693f61557f759218dabc44a55b519021e8340c30d47861398fd0178e2a621f5399991c658360346c70a840fd5ffa05483e4e6fc53f346d3b43a4acd521861b4fc45905d73a6fe06772e355ca9e25eb9062880701e26458b87c26ff708dd92768f0632b3b8e251ec487879d35dac1d160d27ae1d10f84b3ac6041612020a6caab033f62d7fb4975aae8cd44589439fe0c79ab69cbd6cb36640033cbea65ae92525e200c29a29820ffd2e230ab5c11d7e3b42c6e76793465d69fa363a96724d3663a9bbf856ce0bf82d55fcf95c3900d5f270c18e238f346ea0ea70730028cbf8611926a4b5df8891b74d32fb9cab63caef501c7a7e54e8182a840362a63d7e99a548b09cb8dbdacbd46b2a03fbd54afc86abfc3ba0ffeab740ee372fa109b958178ad0c1b3b7d06e8c8aadba6166b971d7bf373c6b19a1ecf1b7adb54a1a9a23ed58cafb83ee57ff4dd0725589e4d80c62d15615d7de4822f69d7555115d000226bbebf4fd418c3bfeb57ce68d19c5d4cc2d6f7abaa6d5f03a562a4afeda234b35096949347d63d1ac89a962206afee5338ec0b1e4185124949fa2dc4be23a65fa25f1be78d3d45079c9b320865acbefadc7f97963b86e506c9167e21055bddd5ba5d4f1efcf7388755fc88a4aa16dacc63d8235119134c11e56f3d5302895e585200d60b5beec7b52c7b97753640ed0306768c684840a21ef3a1a3c817a5b3ed46917cc82471477a70815c61bf89ae9edbc48776ae1c00e057a4bbb97f47fea9cbf1f2721d812f23583b09c54498c5532a354bd4bebf6e0bb05249cf593a9ae50ff9510adb36f08042b7066844d6e94ddd12c7e8e8e875d795d2602854b43cb1a3aa4dc2dfbe9a19f84d7cbf0c9d41e95323c6475d779dc158638332bc060fa6b3850b8413c423f7699575dff86a7658de2462ea92bc0ec24797ff32332c5d6d53ea61caf83e70afb3f83fc01294904b553dc9b2164bdf69b91ae760e51b60deee27b83a10b81c0c895b35800b9c6aa7e4e0a2f58206c7db28a529d60e990098b3c2851cb69dae4191102d8e28f427d1da058ce99a77f8ef437ac06ece85e0184c91df79d3c5d1400dcb2580722a2471528492df63dfe4cefcf7b219fe3a5bf3472eb055a283701ea86057c7fab7f7dbb296eaf5f33fbcbe718b14ec282dda924778a82527e80c3e5019d0ca891a37b48b404b7ab0274d62b4cd491c191912c8cd68485032928bc6765426f3d78feac52b20c2a8b5b0149cb517715ba5561afbb0aa17deb4a5a00e4592fef5b164d255e30f336baba1937b8428e3dedf93176cbfacbd647c3339278c244eccd3a4f0348ae5494d8c499c2441566bb9f08a5b20b80af922635c61effff48e4d62b3ecd497f9fb257f41658a6d0807ecc9758617d461e417bc8b1b8dc80ca73ded1040b6669b133c35a7e74e75dd19b027262a985c2746461a35f3768edf88675d55c9421fcae9ab283f91da4977699c5e0eff3d0cb584690d98f8dd9f1d08a748a2de848ea28be3c9d562999c26380ccc3a34330faaf2be93a7e5e7daef18412dccd856004433133ce468bb77687fbd8ea5ea6e1472da71ef4597c5d57d63d33f0be676fd505ecd843f399f89265481ce5cc76e36a519c2becf8182fa12d3241b995c7486a208c0a8995de0a450455199c7c0fc74b88473f182d40cd051499751681605d3d5b30dfdd4e719a723bb78b3941097598b6f6353ba3d61e2a557cfecb1db59a1a34f78c95ab93744f305ea7ad4d279830a131c195ee69c5983f3fd37a64a6c000dbedaf0b3185a9709ea9f822b1c6c02f8a6e76ebdeb05ea143792a6472dabd1652866d1b12ef674605dd5d2e4fa9ce5c8517a3f804ebedb1a1bc476f52c03a23a15cd992649f2e1297d714a7f8b4f31690dc15e806cd8aa4c9d4669638cf901463e0235741de3b339a5db51b9258301eaf3df310af35651cb07482166bd461edaabf52669f4fee4e0972101f4cf7464c8534ea383dbef3cf21d3af39e09206ed1273bdb3482085ce0381268d33e8e7cac4a72a4cbf0eaf609fc2c53cdfbda88dab39d301aeac44d5b8b3a1f39842cc70437851ac6afb1e9028ecafea31a14fbc6c74013d1633795a75956dfb83d7040167a9be5998c51f7bea6cfb83b88fafe5634cafdc11eb5f68d3f8ad9fa5d289195ff210793435e462bc502c4683a2890838bd7cd2a722141d22e1af41868b93d2ebaa7cc9fb7d771cfac9b6b108781ef32e91814cca9309589a14ca72f6887eefc033e1a0a69f4e9ba5147c8bf5839d521c46330ace244db29df8e24633e2b817f4f8e4f9a934ac97129f9bc80c83fe4bf3089364f161a100259b2fccfeb99a4302489618fcce68996cd4550b79e6bbb936d2604e3166e86034da9a079497a75fa50b8e9f9695c2ac34a4922f57924f1e5dd7f68689e4f19d1e923f7a2f5f6f851c5303bcb016729d1f55282c86f2fd05db37d4f2da9a333575d3d454aee9d67a5476535df8f48895b61be690bc68bdf22949f0f062285982b8a86f6f4b339d0e975bd6026d15999fd045bdd038e2e762f45996dccf225e91edd4f8bb1abb022b428c1d91b5f613c270f216b201b565f593938a7d7db0d4dde7248f052b670781a11c242ca278676df57c05ef69e9f724316bf0276ddeaa26a618fd23b6e32c1b7757e46e01e3203a35986ec0bae29a986dd00867119386334aa75fe48adba0b80b165590cf59e554834f838605845b6a74696cd7a6b159476d16b178ac54d7ed2d6d52dc77a26b3b1e2edc269ea5eba1798a825921a9da1cbe7f89f0c517dfd5b2d7aa200b82094206855470b3f18efaad7f552e42371af5319ca48bbfbee4de27bad61846e8d3da1a8f517e2ad7b779ab7e1012e4882e6129055b4c87ee76aeb6c94fa5477b866f90d6662431f1b93a783ec42b3af924a1aa8d04217e7f246b7c6fd8682d2b571010197f8e5b1347651f90d808d97007e97d80108f8f84e27b27580e116b7c9eb511a5c161aa15b3ac44389837b38d1b5f94619c78ea16c1cb853f7eccaed431ac917c6ed0de9d1e18b8d13d1c2bb5d6a00340cd44153f3150277df5448b632b15a3055dc86c66b688d0b009134c679a2629004d7dd4692ef5f126637e3276862ebec5d0cb33020a0a5cc36f4d55efcb809ec89a39da6d62a07aa4af46adefb30499e9fe6abd77829d9f65cfb4f094d9310b9721c415ef55e02da016250e3578d23b72df1a6a4f294aa48fddbf45ad97098052142f1ba96569d65cb7c1eb55b6579f5cd1650df6f394aadf83334b026730144597fdf779a43ace2c6bbf45b88b3ca5fa4888cf451f2aab557ca3142923cd45d908d2ab6954b946da4b5f8a1a38e9b53c2b45480605d9ff6902ad9f3e96fb1b9270ed7e52782afdca7ecca094c7ab4073fa2a78e45d9a5b3bb3d646248cfbaab80ab5d8d2d2582951702612d390741558f9232415bafafa8318b0c17e045bd8f73da7c9c0f564534f217cc0cb65e058825565fe549302f1585bba62ce1c09ad0b8500fd9baa59d30b750dc7e2210d2391dc31d6ee2c40da92ffd3ed0710f7bc325ca0e2daba9fcd1b70f2ebb2df3eb03f723f4e3ed25da78e8fdd634128c972f652528eabbff1e95e2812837c788a247a2ad954dc65140116d85545a2a057bf62c66e44a679dd25ddd14d3273abfdb7a91b9c26c63e1db031c2f39f875c989686a1801ead3541d96effa5718488f8704ae551e37a67af923b7bb1d4b2b042ea04a4ca1caae2e5d65b741c1a13f2b14ec2f72c58266f67e7ec694a4152dd115c7b83e931c5d9748c54a6fc80cb2905fb274a233835c34b896b44e65b2ef5b826999e1d5a91e93213e492df84506a6f3022457450b350382f9e571e879700e9a6b631d8e5d79b215ddf058ffa731281e79f9303b70787ad62ac8f58abd2dfa18f86e710534dee86f6ea3916ebfe3f7127835594e4342f54f0100988e8ab9775dd9753e15b7227964d2b1a487dc31cb15690e228cd51fefa8020a33967540b681d935ec18114da0652a319df5b5ba106c9567303f0cca08c9b33bb12480998b442c37cab0157097060054f4c3b4653379bd0fabfa6300ff9b87e26b073112b3c85aaee2f7f47f06430e94aaa6cc4955c9383f656699cac4b1d29990d4341b115a197aea7f647d11ea3086183be0e0207c7c43516d83add1689f4503441235b3c772c849cac1d54309f9408d27ed33f55688b4506973bdeaa0eff92dd3a595fe1ff52426dc411888aa2878ed8365c9b90b8d9a19a972d6022f5d6918cddc33097f554eb25f967deb7d32c5729850c77b09308d5693dba223349b879404f9fda15d51d72f7086f5f86df583737e26c18597a0a5c49c7e13d33502baa42036399726634e8bd976f83bf5d1a311eec22640c774411e02a6ab61bd10b6a1ef062c365db9a4dda51eaec0c0a19d5fd99f894ea9d205bae8781c811ab0724a1d8149d749b60cd0a93662788a14b8d8c8c1a35c1a566ede0be8e49c1e7b72228ddbff10ac717da4e211974cfef82489d069de1b827772443d667830d05d5c274278d5bdb70c66d925653dc0cfa7489f6abd65a56ef6b91f6de92d85b373e9c2adf9bf328825fe43c6357b3de00c9bf8451ed90f0d174a33410f0b0eee58f2b491a2ae7471f2a640fe26f24d6d209efff11684dd707fde02bd260029ffb2e16803652fd66ae22ccb653b2a881cfc14a51f96d75be7a500ad5c984361f4f0b68c350877016aef726b3e110b11e6da8d58872ebb19086f80b211340128e0d34b7a496d6ed328ca893cc6f2e09cdfab077718f34808dc8ee68c32604b283cda7ca0bca59c1b0a77fed570f4843ee6d866ae9f43295708ffa825d04be6eae1e079531638a07f34577069ac7580e229b9bfb145c930c1270fdc86d8d0bc542e4367b5da19f01aa8a5fca67be55a23a08bee0f07c2095cd227218b5d15873afda4697ed3d691d53c023e467ce402756a07c1050935d2393d6808e7a5407ca76ce26c8115d2c29806c97e2745fdae657d7631d422cfa4fa677165c62efd97c2351524693a0a268c0a7e6ddb23a5d8e800d819e36054e649207b2697d8e3bd016f7222b01c506b0da741467dd90a2308937352a0a9e0ae49b4a32312a2061495645592826d0c1fec003cce068dc0506850f501d6464d04a597bc6d75df3e9939f6bf822cb2fe2826a572ec6aab30617346e9e05d883adef14cc628908cd67c8ba1120230735477b181d7f56a1b0fc02441947219154bc9e747df824ab3f39e0e345622fe775d1c2936a572168dd0d4de65a672731c7574fcac6edaff60a58695333c30262aee240bb101237790931d2a8583bdc6cd917296b6496164755497c2c2a5111bb327b2489703aeb737fa7365877b7952d83beae2993f258d136e352a4a645bb0a136256ea22c6878dbf55f06c4803d57b5be9ce9624587c569c164798534ac610ecba14880f56926760f8401b81316175795b8e4a932fee7256c778ec7ecb43fb534db5d7144b0da3e6b4046421806908912c42d9ff6215e3210ec50f1163de9a9cec2c8e34c0ee429d331ecd6a2683ed4350d104a75641d05e55f899b5f01df99d9ac1dec30914131122ff7984c965272489719f60a4bfdbe70f4a8c977e4a092b891a8ec5461ee26ee63eb5dd7f49cb228ce35b8485fa92df983f79bb41c59795c82c548a5c82d3ea1e0a9df8cbc37941422ad4826ec81078239e558900e580208396843088e23fddcf8886e0989887f2e89c658cdffe571f464949a131df9e191b09cf4d8baab9b168cbb9462b081bc578a0b71346f6f2baaf3915d07643466eca81edb0edb94a907ee92e22e627e38c0f4866535b865f502f290cc5246ba653a2562d76f42a509536749781b394f8382a787075a0ac6515558ca904feaf50dd7f6db72f87915afac5fa1a550384cc0554dbb1540aac6288979f78bd85f132344f41605b3b893160970bc4bd01c7a45b79d433e980abb6eba9d7feaf32b2240634314d51dbaec2039a1c0feb6baafb9f63610af4cc5ac3372fea06cc1af99cee27e91080ff03d96a08f24601b57f75c15a41092ff2b4bfd90b88266cd046939070721a1e31c659bf72228b8d220100205d386bb73abd61bae5d9bb30f17fe02e6fc0b2c418a23b3db5be0b596c5b2a83846555dfe532a29e0895a2c8d3fe72c2ff80ba89023f21ec672c7c5d6aa4044e55c7b6920a11c251bad2a49bc4afdd500e0a2559dd8820231b8b5ed9dba1f8975e670e9eb3f90c69d88df7b05eab3a5b2dac93e318aafee30688a5d2638cc3bf90ad1c6e91d3f4ecaeb53e2c9a4764beed58a7cfe94be78baa29323dcf2b518d8d070b84224a9f452e7c69e66182b35fc553e02d1768cf7a1a96452029fa31bd473ccb4571fc582160b5745ac6b73efaa07343298e5ce3c60d6082809a4b4f826e3409edae9fa2515b7dec148ef0a0cfe7ea50f2804343f1d3c7425f7938234335211df29e99489e8252cfeb1ec83a701d30dfc6a81cc7b74201a8a74dcdef75deffaa4e5ead3f2e57d0bcb71558d020e9e5bef227468fd647d42c2fd82b8fafc77b8a46e764b8e2f276f146e9fce2893cbc2d0fe8af6b6e5723ce3d5ffe0d6374d090f5e45cfa08f7c9a4a0d6f5504cb11dbb41660b90fe16f7c040acc529bec51f1c1297463105b1ad78d64a4394724f70bceeb346e00687b8f68764a2b2d4add9de0b73b3d131db1840d837629cf98b377efeacd3b32d6836666114429539af44f6e3c7edd46ffde40094c5144419fe6a304b753ed194577256c723a5c23255be1faefa99a131480ce311004a439dfc363367384ef26ae4c885d60bf0b2e15471f67f7a6712735687f34ed0285a96f05564d72a28b1c95690acb87f3475ec23223fc78438d6a11781559ef3a4dd794ff116f8575eb3d7fb17e4d52bb50242eb650f7df311b3c9073342762259282f4185e306774a425a2fe1115c248541babbef7bfe7ecf8a589aa38d1c8e36d5c17e0cab16eb3ff87046489398906d368233efafbef656abd3b4866ac6c1692cff30062bb53fb9aacc7a804da4206526620e5cb379b944e17f215b2eae05eb40533310e7a1f29a3c6b226dd16740d02f886574132b161112ffe0276c91811a509fd6365cbbf54343030b9ebdc263805b57e2d48cace1c6b2027fd8c3c7732ffe33adb0bd024bb452a2c5ad534549a64c9aefaaaf7a1588ead3ee2da88043b507d6c4f8c2cf1de3045d2dc419441f2d276e0de9776543b261ec8c2308d8b8fc42c8f6bfa70446dfd4186e17750a6bf454ab350cdd7fa65515b96147a78ef35e7b8565a5eab94f42fd99bda8b6ca137b8c3a341bb84f67f92bed18d33d62d05fed485a3639fad434d2b98670d620ab64e97edfdf8696dc565b0415f6875797e4d51c2decacc50acfa460a42b97045999156f34b47eead85937679d1a306fdb9f6a8d0ee6c2a5c61ab9fe83cff9ab409f29a9b9e77c1ca22695bba7c77a210e7d722cd48f8ed5c67799a416810dc694cc333d1fff224e72cb74c5b1fbf000b526ba47049b1b3b38dadb1f056d53d4ddb09ba2e084c0627b0a321abd82668fd0861e8e5455446fb184881b38d96e5c0df1deadb9fa4b2917eac70444bbf71c572b18f6aafdbaa607a07d8ae4d6ae39e715db6462f447036d4333a8f5bbd2f1d67db419bfcc1afe0da751aebbbd0d92f4725882e4cee68a4841e3225c8f55d04c1b3fe2555279dba3b112d1dfe1b190835dd513cfdd5a43e26aac43dad2dc169ea9c3c23d53519dbca0731084bb0b126d045155bb118aca1f6994bfb2dca5d8b6dd12586e2cb3a65ef5a15ee2d27e6bf5337a09f662cf279d7979d3932f188ca81cfdcad035ebc8ae3e562770ef2ba926a40afe69e8644bab595c7626c4793baa1c225f4622a39f63392181e8956da8692e490183ba71e903b57f8ae625fb3cd7d318c4942d03d3d82182cf759231c92e6165a7bdc40f40f0f5035ad9322ff5257f44747a5774cd62a3567860033186faddbf9007e4ff661a8540aec9cbc21ee1abea0ad3f775d7323e4795168f893853a9a34493593e9fcc2878ad6150d18fb30ad04a49018298c28bb68f8577c153d25c483b7a2deaadd5c0cfd55ae7f6e99156f475398751b5b75edafc5e0840f16206f6ad78b647bd2b0bda4be8332e9ca84962ab0667d96c6865e139ad05e6c0019a4adba2ad721de588003e141b1fffef9824b31dc7a2113af96f2405215d2b8c12d8e63ad2d00bc2f06d971fee53dc071fb88e43fdea2e4205ec998ba81571576d6a7810cfb39b5c61f3c6143ddd394d54337950325d23e595c96113b1106f99607bc98e29d3ad5c18c14eadd84e50248b9d8b95a1dc08a1a70b102541d5ce6a60ea88457d9e5af5c3a3f89cf087c40adb30007252ec63972e76d25d8b1ea5fad0843ed4f902f8efc5d0460ea89cf82d7599c8aa5241792d728efe8051c93963a8d26ccc9f4ee7d838d3555499527c9557760c185fe97096f9ce75675edbb751bd26f9fc298ff9e92d66e86d343fd8d70403a675bbffe58e879489acace528dba1e637b1ae73ae9429fb72b8295cc12e8505a0dd5c2b7e2455bf10fcecaa45179d8aa43ffa9c438f1d3909c6374a9ff80d465acc71a4e44fe708f7e15dc8bfcf6272437c4b1a96fa6343ea8d9ed1eb70709236457a95aa7a2cfad0d2c533fb718ad5b19163f6aa3d92ee09dc0fbb9b84b643bf8b7af1552a0554f364810b6a9af801ba3820ecb707c0206c21a29ef27b827c6846c9b6e26283f50b840df33c45ddf3cafc9d478dddc34eb849824e972e2d1c9e127aff1a6fcb4c93750ee38ce6cbb9e2349411830a237a38b71dba4da0a80273d810da11f67767b9993e7e8f2f2f728d76b31fceee56f5bdeef47840cd488595696211b98f359515d9aea7eee4f751e2d4edf489c255f4b3fed9cb86cabdce3c54eb76801bf9a64af10306c8f1107bf544ccf88d0c125c14ef97f07535b570a3276180e48f960627efd90294c2dffa50eb0f47ba9238630c04203413c9a6a9d0f535135b0773bcc3e7fbbca13f97046ba193249fdaaaaeb18fff09573beb643bb4d6228406e8f72701e38f5b19a0d3243708efb57008251631b8e6bcf7ba6ca73ee7dc3bba1cfc12b3fead38abc7425a74e536322b79f3d151f0c37e921a4661216319369c8955c8a54d1e30e339ab49d4125b77a42c0ce051dd105cf3eabdd2cce9ad7862c58e23c17a94ce16045cf931c820a0a39cfa7e40e4d411d3dce1c11d326c3bca73aa38eda06037cc55980ba93ab2a75a3727552e19f5bd603c580c53a1c995e898188dc259a994456b77b533d37ed2a34bc91db135f7fa449d9049708f764e1110f0fbb25ef6b0272fe6abad7c46da0649df9aaf1f6efbcdd319f93acdeb3860cc9732b808246d9bc0a2bee7be752d9fc39d378e32cb6bef7a367eaeaac5f8f57435a5bf6c67390ec433df998b3d236b6e698c7498d20b7c747e512c38c69cf92a4cf2e1b58f8aff71adbebc71cb9652f81e0e9c00e82363503aae806983b17c3a0a9975c9b93a70ddfb842b90cc76ec41db9974d138efc33b3bba57d32177f0822559972075d8177ef3cdb3f990334c2eee791ed66a74f11917250de690c02675c04b8aef41b1e725c3bf0c770b75e56733fa7ad1423db0a01c3a01c50b728168f90b47ae5ebc20c8e7ba13cc0090a79d9b23d24550d08a12283e7a743865aa884b13ab9a70510db40dd4e972e4e57a840564b67802e1cb6f433e95fb1c0f9ba2c362d102377b2ffc43dfce7069e8cd24c2054aba0b35b090f7275b7aacd480304eeab5023f20bb448417e419cd3729c2d7255e6ea6a5464842852de568fdaf63cbcbcba337cd1996f6b1f9a7709637de60c4d9df9254cccc6ab611c6df8e6f41c11a7a6d36cb076c9924c2c6d6e9a46d2c7a571cacb6395819924649dffbfc6060e5e477661faa01aeb87239397bfa703e9fc873ad401796fa7f06744416896cc0dc860d23e5522e0e1ff8e539d81d93af027adb3d21f5d4ec9a9cc587e62e66341973b6c52e4438d11b10daa795a44e2295b575ab5a7f603ffdd21e5d10485e4a1521ef031f80b69ad9a4c67e8dac3fc685000d942a41f2f554a1dc592e1cf022c3a6b826991dfe032c83b618e93a4521ac326be48063e96a5f9911fbe16740a1044ab3957598a9e00b1df4192e8b751cec0376dd7dc017a5bd2bceb57549ff363cb4b2a342517763c478ba3608de7c3fb60e8aa5a05f0ea6717204fc050e66e3ffe029c84b51f97cf2b8d3c085350ed94dba9413323de7959b1ad93ce69446ec0a83977484945b0e114934beee477d13f803ef560fc6c88cea1c34979d0493859c7469d795ea1cbea0cb5e92b7dce324d54ff78702b22322e89a5df1bc40f17e3b552e31684c291a4039f42ac31de2ccbfd57404d96c53d21f2a7b9fddef21f4a56d1af913c7b3321139eef57309c47a7fd32003b5a1b0ee1d64fd32307d34a1a3f2bb24e0209646263d34bdb2a6a2bae3bca5bf82581a0889a02b9a1f75e306eec6ab9f9a23a36244be436a7539f5b89fe8b6a4004394a80d45e3004dda8d00b24c736c62b9b3db3a8384b287335a20593631bcdd106fd5103ccf86317ecb827fcb0ca84999c91259d6684af8097fd81188fbe4448e8c48873c03f73188fb081cc4d2e9ee0e15145019eac447ce041b678465fe25f6fb6001ea856272f8fb08456858f98bf161a94e95903338268aa74e469bf37be82282e05e23554ff51b5a95c2a8252d84fee25f059b57a5bfe79d1af541de63b91c52d8dacc1b2ad11d2ea15c49a63b598acf16a909f5dec59847c63b0b752ac995affdb9f798e3fc26886a65a22613885ceef1a81ff495e175d52dbcd524a948cb218a28f480c5c112a84b2655eebd27388306cf1956b3e8aa714c4f908099b69c5046a5b0eb66d0b77db5db734a11aa51e462f1141a3f0011c8494fb37940e98ba4123075aba170be5c4aa45acbfbaa91d9a6aeb3a2cbfb7c0b94fe259936690d2aa0e4263b6b1180b1868d8fc835743128e40605f79f7ffd417cc13a165475153c44dd1efb1eb38786b1094de016b42a865475a602e50dbe533facce174de1074868bb8ec5da88d6af712ff033b9b40a9205c65b52594f617bff6f7f6014975f3242280312d728543a6475f10b90e12c2eb84f82a1ddbf8e2a80fa5632271e865274fa89cdebfb620e75efc9f438a427eac1db2ca8af4dd040c39035470cb06dcb18b82d578e8350c0bde5edf491695307d4741293e062eb59c2172169e52fbad6d3cf5c823964e5ff3a7b26232a9ed08a9b7f6ff166d2417afd8abc9ccd08132ee2fcfa47409f274d37d4535dd2bf03006fdad3adbf26ee8b6e06f510f37dbba2a921ace46fc32e84372220959b6544e3b2c8f69902408887e2763e53addee6eecf1ea80442b2243821c489c91822d9c74f5b08efb9c4b7100159cee015c97722c09cb968b7588e098a36fcce030110954e8863646727f809206fdd44863565f83c3846be0354372fa056779b23c0263d126c5bed55240397ac0d3287da4d1a4f47b15bb20201acc46674f5128646acead15d92eff51d0227894a66ff58c2f9c5c4b30573152d355d9d090f2bbd6b31467a9f10ad29b6ccfc83febba1e2cdbe93f653aae8d51e2c3e68d465bb6b4083c14077ff588d25f173a6df1d1ac0604ba7f85f7f33180f127a5c683caea32ebea97bade60617ef83222ee409b0d7f271bc8d14971da5161a90b877d857b7b73d38c50b82b9b07619ff2fa3cd0f9d3cef457b40e8e6999943bd2dc1f71074c177fe388187e9a055a30cb5efe1213532473a35e9ef93c6b53316f39ef57c0071fa761af36e5c60e11aa61053ad8588c5f0e2c38b0e3e8e56cbb5d75412b8488e5daee5ba1dfe59beef5ddf68ad0cb2ac5abf641903a8c36948d1a0992d5b8c19339d0e09ff134e1af4cdd52eff62648a8285856301ed4bcdd594770e9de5792beee7a521428109cb989645c8c8512dc6a316de205b2911c1c3d05fd2103b51cc978138be60e4c30dd589a03998b0c292f5d7976a389f1ca6868ad8084c1644af07ab43185d025d3edaf14b7109dda6344aae95c154c05d2a8611551fcb98c55fec9cd5c5d39129673a0bc9e40bac61821f0f6d67384d7eea03d5c7b633e4a67f14c392208cb06eadb16c8fa8fb2e4ad44c3c42e67ccf657f5eec79de99093763195e41391f165b317e18f92aca5cf43941e5ef6aa1f8d292b4fc15b34abe15667df121edd2790bd6ebfdfbf55e7c92d2a2ec0032980881ed16880114d6fb90fd24ad4a1362afa12d86ee9a4c4573a40456f631f9d9a02b8a483d874d4b40bc8e88cc3437464b94af3cf83f6387d1b9b40b488baef6153daf5966cf045dc262c62e72edd35072681b677dce4d5a0b9ad8648aa9871c61c311a711ebcfacc324eb7b649562a44125bf9dd5723ac77123e3d92305d6a31d9f940080aa2de45d3e0d0be802256c5ae2017afb33d18e3819c5fc58f60cb9e58177f71e1a7ccf570be67b33c1d831b6d71e7f8c6fa773061e6007f7b9ee3b9e318947ae90f8b386160e6b6a40d0c80d2cdae96efa8cc94caed352d358af130a3653b05b580f0c24a29f7c8bf78c36ca1cbf01a745a56548cfa7524d5458c2c293588d9ac1bc3b4de4b2a83205d97417793340c54d13b7f6f0f3e8fa31e6cf1eb75aaf52e7e866b0ad9f7c5ac9d509ac11f0195157d0b3eca5843b99375014906b53d79743fa34c044774324a73d0a6f544e7f09ec9d36491684b61d0138c08ffc9083872a7f7c4c011bf3bc0f79ba72fbaba84172670cbeffea721f46e368afb62098073c501e7223980484c8962eda34b06227180d363adc14612115d3e07501d30928f315884624c4179091825463a28863cd8d77460b168be8592e537379b0cb232796705ecfbda5791852979fd31df99cdbbec582738fef1e3eccaf198a35ffe755b125c3f54f3d68da968fe83959ec6a5366fcd6cffd72ea1530d2eb0ad6efe9bc5a64017716a5328b7072b432ed8fa5959a2d57b671cbd50bd2119a6fb43c53e2903a2805feea8235f5ad83104d5e98097093682b4bb3bcdce557b62ee6fd3055560ab357a5b7420043925fb7110713e682c95e5bec3e45d8c2606a174fbdf57eb3fc116ef749c0658f6742813e1deb107b2747e7e9695d06207d018b1ea2564559b6cab71ffd39cec4a7d9c76daadb2b0d1541415a11bb0e05fac34f73ccda5db1c2533c25209c0a3112bb9c0340bd3eb4e297e940ba42719e8b152c32be926850edff5c5ce6b0885999fd9634cfbcbfeddebd8f6f430e5315f8f328edc70d95764c092a5687038e95f736564812954f263586752d3d39f95a44820b886bef8d393c28b9deef8bdd68c2ffd1ec50f1fba74f1302929dd75a37b088dd3abef356f780d84ee84c1a26f82c4f64b7add14179ee54932d27ea25c97820694513e1eaad4a15fd70d142f20db8de4d0499f1faa838dc0828f884dde9629acd4f281f4df5043d11783c073861918e6e6947fdf564f2d2e454dec0407d974c1d950e07f4b4bf8c814a2cb61598bec3c64509fb8fc4e30c8b71187ecb083671b98705684d47b7b126bcf9e32d083a287269af0c64a245f6964bc10d3609bc63a052705e00eeb4eca843074657db89ef79dd426ab0c075c2577d22d697e41cd575773de39cd88b0c31f8f124d63b458f3a9df96f0f931400d6d02bd98baf80ca588db7597ef55417bb228f5cd96b6d066ded904869977aa44acb79b992bbdc79cb760cb65d8096bc273126af3e3c9e73347dda606069726c6a33afe9789e612740adfd9a03e24ce7d0df40fa7b1d7063cf957ce52df766f8d8ede24d55e8e9bfff1c57e18eb11162ad14d911950957fa6467c786b9f7cebc00f12562ad7f39981eff3302b06474cc3a14d4f92c8cf7b9f9232ee6e13fe27c8ded362df2524a4720644299dfea8b03a0f132f644bfd652c179e24ad695885f08dd7b48283209a477a6d8f2439ff79f67e511189b5cfb3d452b7af2f5ffe9fd4f4b9a74adf1f2088496b1c5b1a6ba083e55318141e32d65b424eed64eea84011e0c6c4e51ee5cf23730f52cc62c4b411b5313912abe9307db1bd6dab8d9a376cc5217f313cc6df929fa97475ad714259d7cd22047bb369f0698609be29113701bda7861b1ef88cd32ee411d16a736ea270079b458897471603173e052df3f92b47c85a6af25496598ffc16dbf48e55ac1fa6d4e5da315bae6098ae5ae8aee4ed97412ccf8d2fec2367e40737ebda6870056b03e4a49581046500f598dc483d0000e0b98930c2d3736c93c12fae223bb0afb0b88d12ee3c816503cf1609dc899fb0fe213174ce395d0e39ba35e97f0b227fe62327a1873358fb53ce052a992710f3053249edc026ad9f213f630e6dfd347aee1727292d926de2fb782712155bd83142a1caafbccfc87d226c502422c9d2d4f38c907c1f8584a523e41bd9d48f940f0177b23b3e9182c901de6bd9d7017a5b7500115575876578a56fc3302d7d31f3a1a90d3ae66e799c1e3765db08a3cca221c717d8c9400454525cea9fe83c0b42171f1fc0585fbd377c8d9f84670cb63cc6644cb6c57d467026609f4e77f41b54271c009e8a777b0f296a18a5fcd968dc9762800fa918912fa5ce96907aed3fbed11ebb6d50bcd52665f09378596afd038d56e5adf0f53488adc9eae6a339abb57d75484879484dfbcd9b3d31705789ebf42a6c9e63f107f9402619e3bf6e99d58fd7f60f2ae52c2fc72de9a708c1a4fa4395903a8b5e85ffc90ecb9175dd894ca22b3efccb726b933aa0e36703572d8c9a2b2e30856b74409612a44a8a2fc722b16e5c8459f5daa7e4d3b282d1e408d3395a31db77f64b9074659dd856e22211b22d10f0e0646aeaaf32527c2753e0c56baf9cbec68f53011e4f9b32de35e3f6a74bfccbbeaea2136678c7975d10f7716e958c862be14fe3972d88feeea428fc6318378b2b6510c3accbd7a136533081016641e574c5a39b04364407a9dabf2a3e45358a2e2ffbb27a35b8474937777ba4b27972ae1408b17f8ccfac9110d716d576ef415328599edc14f99e8ea82d019d5869e1bd6e9ad7bed7e9d3cb0bd0f44f89ced6855e2671b2c828576c6e4033d84730540f8fd9f165c06463bf87ff0dcf15f3eb879409fa0caf5bd10f12fdcbd5f263b1f0026ffc2a0fa85dafc037343f8e8f802a24756403fe4f14ac007a9db15d9d8d2f7aac64ccba4021e22641a909977b01f629314f5534240df338fdc8f8b2c5c2a08d1db319a30de548635d2b0e1657c0c27e3df63ed2cddbfdba523c85fd75f177810016a56f4c3ec06d81606e2f265d84b05bab893b31e86b63a792afe91883a921bc4e08b0fd4d33a4fd059f7800fb2c37a5049376a99e8c56d85723df3cc0935b5b996f61548c080eb37b390e52e0bfe4fe88e1911851ee50bae41b699757ee6507647f89703f7a35546977f320ad25586cc404c10bcd624e7fd9baf6c47a7331c0261f609897ad79fbcdc7e1b3b7bc60b2f2eb5b412bf122ea955761ecda1fd7096f094470d809078b311833f1ce92a136f99a17024fecc5f0da5749b76761860e5e756ebe8641c1003429f438460cf7967f973da3073c3ea5ce9406d9e0470a97c20f19fbcac796b5319bf2f42fbaa877e3e2e096ae6e104af299f321e6c95c38aa2a9dfdfca87b5eb4017a84a672a5e9d5cd6fc85ec703105fb9d243a6285a829fa1a9a0a9a80610db96cf3f383b413f53ac0cf03d7946c4cd4395369fbb31d012bc64a5bca3908c6a0768d875ebf07f7cfa4924bf44fcfc4a9ff782e6d7a42686847b9a533f997bac0aa7a9b72d67a965ae7f20e083b1aba861e5dbd73b628fcb7e32927efa47768ef837f8791d88aee1fcbc19a993854405ad33ff79b2be2a980ed1552be960a5c3930dcf04d6fdfe09b61e99f2ff56186a334c4b637da070a78eda233d3aa9817b7569363bf6edef3a3ff7423d43c0fd3bced5a48a56681b2570385f9339ac6706e32c7d435195b68c75b099aebe32e7d88586581661400602b3bb2ba8b64a071481b94ee0463de1e340effdbd12d694b3e6a04065b69e047c30de1fd3531a2835cff02ed050b5a54528fbcec3f3c95bd55c7d30dfacce71f824145ceb555902aac97a3ff3b66a0cd966df9f000f0ae331a14a5b7bde0be598782ea071c7345a2b17609bc7871ae49ce7698f32ba5991adefa2d1e8b5d301b4ffd0803aa19ae764324e6ff2a757b54d294398bef3dbb14c2f6128e59aff67fe145f2062a65651897c62b756bb4120ab9794943a8c768d0211c50fbbdbd8fa1fc9ac958a582d6a834f0bd15d7129008ca24229caab3616836b84cfae01745d12fe015705490f01cd97708c1cfcd0d0a69d804743f878968d76b9e1548cc8f58c26353357c7cb7036a5a7d75258eb9c3d4b056827461f89c079f892bd22f67aadeca934744f05450561ffb07c599f549c2fc7a64cbab6f029ab52809355ab8583e632ef293fe5fc747ab568daf8fc3315d61596d0e1766d64e4a7da662956cfd4743e95967f3112517a304b6ef8a1c372ec597ad608e230187a1c77eacadb2ae0555cbdf95a1baad5334344796f8f9375b12ec9c5963efd5bd33085c4e994caaa6da87ea0d0dfe5f358a189ea111ae85b04873eca5b1170d45330bb77c60ddb71bc2b6d2d9dcfbcae6593e888bc57315ec29c583872808e0552952b6a0b8d5fb896d0fdef5756ad13cd5f8225f1860bd6c25477ee76d9e9231167a6e83b312cde1a6f3fb78006f288bd3ce996fd4c9be415fa718185b6607b190baae315f4462503d3866394e4924ee62fba260991c7c686f7c59f9799d49ab1ed06ab95a5eddfa230918abedd2465868c128c6e95f50686588a7204a1bc8f2eb93331a69df3b3c3d0403b71408b24d582fb53c015ce7228de8241c5eaa4ae196e376f2332cfbc0a0d7bebf13ecfb5f1625651f079bf1ed1cac1cf275807e107dfd3e9ba272b4c3cfa94b239cfa9f2225fa2603945a3ebcd6236ba4ef00e9d6a26fd39ccfbd5596bd4cefcfeba1fed1e331d6de563901b103a0ce3324f9bcc8f1bb767e81e3ab7fe3680dd9cee721350d2c264f436c7de1ea32e84969959d0d0a19b7995fe083ea28ef8ecdeaf1af3d4fda36018c019d6017127ff3578da1415c5c6ca4f145de92c48089a23bc89b17df162f6886c124956041240ca673f499d9d91bda5948fa9fce96809ca1fc0c308c7389ac532002f36a81692b3f891e14c191ae9b2d6889221358ddd0056bbc53611dcc363b5334ac08f868ce8ffe9742dbe5997498b68110eeb5b0cc4bcfdd65d5fc1acdbaea9e67ffe669107f8da4385f3495445655b6d6b668e932b7a398c646015634bf3d4ee3c109246da22d475ec77189ea3a9ffff2e6c8bdad76bcd10d4999c3a381180c03e60e17fadc93de4a0fc4d64cc8dc738b93eb0afc3914c13817963a6cc0cee05852e05536503ebc8f2a96e1a04ac38268f00a030df09dc1f63955149ccea926633a5f635f0f1b246fe0fd6ac8e2e82d96700b6f9d05e9b0acaa1686f66043fb57e576d4766a50da0cc36c10c5d04378102e5a6dfba61ebbe95bfed55cd6a9bf471537f7f37b58c36cb8ef09f5d26c584434d34685f71889d07d15ce178abc0341e38f64c540832b13a6e1fe9b72a369add67ce2fd03298fac0ee687f4076693bc157cf40cb7ef88a8ca9bf9a056d988dc89e3f6033ba8968b68254df8a1f3f4c749faeadfb240e3d40b1e6129160c1c600349cc317a9230ec9692ce7a2d28ebed6b099d90fbdbf07822fb825634467e0871c23936916cb9d8868f699672f20617405af1910ae3a734c364f7db6b5a93a985e3fb5a25b3cf48919552e1838444dbf0e983aec0b73330300b8a2d7629f6650dba78ddda94ec9a91f7efe85830cdc1874eb30d64b724b390c799b0ade1ec7d54463afc6085e13a49d873b92da3bdc82a34d505955b8bff155c81443b74b046ee25a3689eb9b219cd0d6a917c8e8b21902af7731e928f758fbb3170ad48e871b1924adecd0e4709e31a6b4ad0309f022942e0b26285fbb567d4cf63b89db2297ee0a187579e0a645c8b4bd26b7271a433657a713058fff4e3d5ac4bd38e7a19e041c116c90fb77d19e61007e008177ad524e0cd74bdf873e2512f34f51a3671782064efcb7a4618b648933e60abe9113fa83b80519e47d96e6426453e969f277059191f0e724b4d4f7b2045cbdea4d23db096663304ef2d2f0d6fca8bdf25b2078dc39aec226f0815742c7f0314fe7af539c339bafe80dd4e3be3f7144a8c7f3fd057df767032b3ebce3095de36761ea1f97afb4dcec07ef4eb75d1de2dc6beeb2d376529ede203a49696d6a66a2c06015e6d1e862f04efafd3cc776ca1f7b0864579b158ee66a93e8bb4f12d56c3ae99cc79157e4dbd73d9409be26e946ab9c7e5ef7867bd440fc0cac6a4c50cb9090ada803fbac5b03f67db320d7c02044baca0123df98e648b6a171a55697b1487a4ca0e974f2a3ee6fd37b5159a8c90efb6c8c41d6d302cc6478711b1698076e50c8eba0078e0960bac00b398d39f27002bed161cfc865f97c8253d8ac830c6b4a7585b33040daafd1e971c6ac40edd5b924f0669b1336afc7d7a719749d06794deda36403501e0e94d4c1f0fceda7209e7418436b62a649b4dfe7bc7964c5052e3594206861030a41fd93b7706c23b3833cd323c0fd595f4c43170a862d4bfd36fc304231ab6b4681f6c284bb9d49bc5ea3b62e8949f39b23689cbc18e00b7aaeb11e47777fe5441b2d1bf5402b749d6ce8d29b0302c0cffb3efd2e92b70302472e0e17d616c0f35643be1ff7a69cd3c9e4d0defc408c77563560e10fdfb0f70f508548f3a1c73c1ac6e46b50a180241dec717d18e2dbb06fbebf6fed34eaef37dfabc51ac27acbeb0b9a4300dbc6f01cc8953659f4f162b8abbca69ddad51a855fa471f3a73d27955f7c51e069d39c89758d3e4fe97016b13ffd16d9509ee4281e87c8ee88474ead1b232a77e17c97431b1ac72c481edacdc2cf11236b11f5c414856766ee495172dc6456743e5d1fb245455b6b90bcf43e25cfc5cad75ce5a7c6496bad2453484b918f15ded0cf018c6bd8d55ec96bcd5e8afc1454d3feedcc6c2a1751353361a3335ac97af5de5d9b07c2de0adfd6f6703cb537e238e67cd53a5f3eb487d1a686d00f876ffd305c89791701c4a49f646c743d8b4a706fbe17cb22234f10ca9f9fe7057d8484918e978ee874b3e6060b417e762c9d1590292df2a750d88792b655daae7d595a94ede5b89e482d36e429a1dcd80c307dc29911f6540e33043840947f5056250c253d6b1f352403ee209d7a42040438256237acd57fd55df8c01f1bd62f54cee04cecc4f29eb2ffe047de4150d8506c9a8b5a634febac52e7e4e527c060946a2f84da6d91746f150fce2d2a406f6ab383972c090e70805278e9eda25a59f8e76fde9ff99f0d36478dc321fd9a3248789f508a01e4c16fc406f6a77024889ce397a52c8c95ae6a18a272900f1099b285e4f121e48eeba3f07a5701cdabf21b5bec728029ca1aebd7675297ef3bf864c476ebde306518f2cd71c6c67be502a6c61cedb6cb4e5b2a753d73124ed9e782883e1bb7f18414a02af4c8294d275deba9d2ebc903753f5591417b7bc74a74327baea7598cc3e128fcfeb844577e40e2620f844112729ab4e0e1233ddb9edb280f48de8797f1c10d57bb3d3625660e2e4bb9bca69bb4f36382cfb212dddd86c35bf43f95deef0b0e0e5ff56ad07d8ed1a5d558306f39471ea56aa8da9ac7cdda7e9d5dc0840d0e87f292ae7fb7e1730ab6ce52199450e83f72dbdfc8003f1715eccd65e0e21f9feee972ffceaa17a494d41f51959ef0e73bc013f6c21e395af4c37e83c0340fb588449fdc80c086a8788f22ac95ce84b1f929f360b7a466477edf9c267b144135541b594df32b09cdfe8dacd9d1fd40fa4fb98651102f9e969a03ab80f5eda64201d689ef3ea92811b0184bae9963ce46a18c09dc769726e8b6b31246606511437e94b0c6074be098acbe71557afaae02df6882a0c461076a37a9219dfc1f62e3507def34ef3111bf645373ce32f9e34bf5bf6e749146e00942e80adb8e7693f05d0788e8a8511ecc2e9e2ed17d2658ac525e028cb5e6792b293c94444f0aa215686ba31e9b97ba4502f881f22b047547c5336d156fa8b4d8d01ffa3b7e229d1a8adb5d4453b6575cc7a446b487859ba96c37bb5fbeddde97f9612460f3b71cc65157e3b7ba638d7332df473803ff6cf90dade6a4735980b084cff2ee73ec7d0d252715a0225f5354024b3667893abfafba3ccc004bf6b421358e4a517fbf7b6a2cd9f0dab254a0fce589d3a83fe0fd8b9bd356005db9745a36632daaf474334a947539c1ed66852e85388150093454812d32c69e81e4c77f8c7a51776351912ee4755db7ca1c00846d90c142e3d8bccda6ce2b893c32b8ad9185b57a5b68a6957f4afc2834a714077433ad160cb03c3ac30b9747777b277270f491943b038dcfb646adc89cd1b431c9214e61b6aeb7c568b0d63d3845748b1090a7a7e048755081901ef627759ea0f5df64996b44b784a8da8164e3f3949b1655359b51eca8cfa953aeb63ba180f4c451fab91604da9d9ae5d842538e5f4ae869d367a29e2913b807fbd617eb6017016ee573ee03b9911e30de3f63a16e8f557729d4b5ffe441cbf498535922d5a53ab1c59a9e92bfc3ec08084bb2a9a813f5fc5fba366c5df0f8d4ed4b2bc9b95445a1500a530f43658a5ce080921b310dccb6d160fed7939d205ba6ac5194a67c6d962a2e428346d46d7aa6a45c2558da5e18220ae8d1ce696f1630ffbc9c3707182e260477b843db7757be908f5e071f0bfbe45f83d3dde8a68c902756c680ebc1bbbb2a8a5bdf9ff20e7b7740e6aa1f7cbbfe571f0eb81534c4c515a6b74bf9da938feb8b65276a3426f0e5938fed25162b955f9243606a1555007ded62d970712f6c919cf11ba6da7f4f892a5d11f424be6f2d413d3dadb7e54dc28aa3eb3108ef4668b5193a225c6230fff45756ae9ad15f441e613b37778bc2c74f6148f1526459f44dc0f40144c70db1625b1a7bf58d67195f9ecfd8b9b76391b3799a3cff709e431ef68d7b652244df265b5ad93ee8c1a1e502514086d5cf9accf8f4530b87c80e4006c108e7c5b0a542fd015210ac3689fbb0b303b30a194972873cedd6598dde095777e2da5840f5800c0ad19bb70bf69ff8298a6d59e9a0dce6e932d17a62d24a6c609e4c4cc88b661bf9139fa76a95638065c1c7c1b974e166de65b880849963bf4e045255af28b6691479c3d6d23b614a33956aa2b7503175a8828059ff708ddd5463e6bf73e2c9aa007bc5902924fba389bdbacc1102a4e49f093531c9a6a4d3194f03058717f11bd38a18bef7a0531e2f20ffbd91a59eec2f13f8bb66340f67c8ab29ef9ef09429ca96f51f294220fc427be8c2c27f1a640e9ab686221d29f1c0827f5cf08238be3d5a13c63b42f52bf3d172a24cd78b90254dd4e5ce0cf773fcf3afc11a96267541d613d30a0202055d78eb68243d096cca2202dd3f8e8348a1353f9c9a18343b06b233f0c37f1fee250b33b3b67d5cbdefba38a6d42e4c2d5c5c9221118961fba8c44ab1dbaaf2287a2ac97460d3e94adbe9dcae34df6e7cb039a2a12b3c42608b6568922279bf93cca42b2cdaead02a0e8b5c76d2dd9021557df6996ce66487e2cca4772777b2333e6e586fe8ff5e70521055bf06a9be6c695aa8d7618d6baf1808c2f8c5a2f976f29d01a3ba7966644f757f5d3b066a41e935a8aa258447dd4443c655b902221061b52d1a7a2ee57eae83f441d03c0c3f816766e5d3ee2d69b12e9872e5414ca2771b99e416921934d79b1291b533198ad70cf3a288323b4d316ce7d1dd22936434edc6d3bfb76e4d8d87be33be7a11e6f8ea7eb7026ff6a3d8ffcbf5d8df17742bf902250d56bc0170ff7d7d1f79f588131f656bcb3abf914215c45dbd65709e3de114d0e4c18dae60478770c01b8e442ecfbb42ec195e91265dc33deb9e5c0ee07a65cdf77a8c640133c23f957874fda7e69242294136c40ec694662e439e23b81c5b24bb4701330380b3f2c61c4649b72d53a2d2e6eac4b666a2309df692fbc96aeb2558e4d3caa0815eed70f00fa4df5bb9cf79c0c54883fb3ea916d1720500b13fbec3af1e4e0898975074e90b222df8a7bca24ba326388bc4f312fbfdc00e45077eb321b8741cc2b0096bedeb47f7d5b14af01f7908d52e10bffd1436b1ff474ea077243c6db81bf7272fb726118387ae9a336f821a650e837e68052736db48ebd7a154d129ca1693af14502d5336272c258775d35c7b6da420d118f6582b3b2aec2d38d0e5ef0ed1eca9c3ae7e7b96e623442fd24f6d99f0f57b45a89145f3a7140cee3ab6979e74de181a999ca303af6b6c60c2d1c1bb4eda4bac9f9528e2820e5b969c33006e075e969e740469edf4e247adb79c46cc74e8c4b8f22aed71efbd2538119a614ed55029294a92a6726367b7cb9bfe59bf4e747e7e48d4662ba1d088e34492df7d5bb6bfa64d501a9870d567653a43c1400870af238c15b7b8bbe1520b2466ea734bf06a9d3326a329b6f225eb1a14b3a52e836325b56d808fc1b2444771dda412e708de82f88f0cad21abffb092bbc44411110d544461f5c18b4b796eb6699c2ce01170c047f72b9353a8dd060fc25b516e9e5e87412bcff045153c3e3efd1461aa4931dc57049b684a318780bcdea75f90301d0ffbe4ca6c57434612e48c57ff0b91a4d1f808949e5c4adad1dfaf2f403dc2a38ca3eb7e8173ef3790b84a474d941eb3f3f8521e5e33c32d5a89221441a040f906c88c7f0e4db840c2a9804c26a6be977518eb20af17606fecf78f19b6c7edaa0f478f8baf05bf930d0a39ead3683654283ccd389a6ba5c4f6e728f13c776e8b554a93d00f7c3b782856241d4c45b44372c942d3f42b02624c398c0bd69c920fa7396bac19c53a5c7f576f937ea0404f54993e479e18af0046ad1d5d84f2d3c2c6e8bda3d44c489445892b3f57c4054265ee2161c6416e4af808af0c932aa6ccb8ea9a4669b02001c43f03ed3730e7e14813d942e7813a25bc9a201574c671ec2b493dcc2fadf384da1d75e3ab3111f0d7f7f681d248643284e55a06be17f87975a0039bb7c8090a825ba2bf2877cba3f57d9e716ae34b7b7e866e6acecad23c8803e51fc18660554960ada05eec91658a43e6d8afe8975a69330f777aa69bddb3571fc9c0ebcca888e7b9ae01dba666923d5cdb158181f019dd35c17710c493cd95f1f7aba0f73e93aff331f9a914cc42e0d30bffa55a65ad033febb2b2ea26f811905205df85461ec9d7763ced02118b334293c70a6b06faa3d6c59959223eecf23a678d668205f0b93e5de660a0eb6353800b3e0f6bb7edac4ca8f7e1518f5c87de3b82fa4a45c96bf4b351a3fb416a991fedb47812b85b8479fdab5592c11b3d569ff6b76e5be2aab4ce3604cb648ffbe38d441545d2abaf926ddbd517ba47f94c9471b835b5fd584038cc287f00ae5a58e98f24970d81c42fca021da79cafd9129ec18b4d410382a900478194a18c3e9a63d30f827ef9b8a6a82713fe2f0e32b3ac0b4109ddd9ba564d6767ace038662ca53c26b3ef0616c5471c90200aaa2d58d16992d78923dd14d4ead6a15f40621338c0fd5610d2de17f06db28a11dc995de79cb0cd990bdbadd02329c067bdbfebed633b724ea6fccceac33f7ea178b9747f5cf11c0d2e986c18626965fde5d4e5338225adf5f05862ab2a57a73b4dd875af809485e92200782df4d3ba9863ed58fcaa8a5212301147d6e6cf383ca2dd76c4f9eeed532585de99d1a34b46bb47f82b00070f9de72288f1c5bcbecce0c9d24b5efc16c4035898c78d2fe793b08cfe145f59f4465efca6f9ab75db30cea804a4d9f76ed41d85d9a9a7f25c292fb0ef4496ff1e13bc905217dc1dfdcc616f281b42c22d1b6d06a0152c46544b454724bc667b9619c9bb9142855eb1979598eb82d6d76a13b3445393d916b6785dcd48dfe7a654ab11d130b1280973c94ef5557a34b3fa3097b21a92c8f52a1aff281d3d961b0321610db9e3b9d327b9ac27cd53705bd9af40bc374849864a84e98b3df353c737bcc273e118d76ad9178d3eb7c10097d7fc952be7fd36c7f2bb060f8f925c2b741567014279a01f2459f9645b31d6ef36952d44acfcbad6dda637d33a8af0446cc8516d64db8f31a901d5d34ef1c3728f6151b949f9ccfd69b53936327d9b532160bc5a54a9647e2e0070c739a206ac3d488125dc0f249d05333929c0b74ccb567e1e06a3b0e9c9ec8eeedec19861c993da62298f5f5f6225b98192fdccd781981f9119d2e61af92311c4de68900c643599c402b63e709633d7162e3ef417865b5aef76ade01efbd6563bc60ad92e51ec84b1a6067bbdb8cb79133b1917a8f3ad53636cb333f5face98d240ed26d257b97b548677ff73b8ae900e01c4ab4937fb6a31d56df5df9fc98291a4a1f6f1473a53bf402ef795afda607f5fd2fd5b2244f35273a3a4324b28a9d56b749cb20952b9d8aa3cacb60ae32402d4cf0e6809dadcd3a1423cab146ad3cb08a9b8e56bd2a7f123ceaafd7bab8d8a6b2e404adfda586807e4910968348384ea257f31c81b6d1598cb93c229ecdb229c1c2379ac218448d3e427ca963c0d843cf65d4b6fda7ff72e52f45b589590b6e9572ee0b18da0489f93bd85deb88cd450b891568bdca0bc90fa03429f96b4d297eb1f40178b7653a08525fbecfb953e8ebc9bbf45d6c039c32ea71be6b4b293a4b16c7c13257dfb0f1d7a61453b8420ec8853186b7b4994f246db490bcd9eb736c27f95f90f5241a4cbc59173ab65472486ec4d53c9fc2181f67bdcfc5d820199a0d8f7ac360258c0f69c969e81bf0369c357aa283b5d0bfc57f83f91b1dbbde1f380faf527bf6639a39852c9c83233c1e355bb443f90dfb4618d5bb4f5260740512d4bcbe2980fee4246335bba434abf37978b0580af89fe916909cebc29e2996a02a7e9faaf90352d9c1af22cdd44a1f6cb45b7e7604020ac76c2b5b43fd7ffcbe140de5f7c2d9aff4821535ecf753aa912785fdfa43a62e68b799c7ac54084e29696d1766bb5d6a95aff601abc5a8e4edc1d5eb2b1888b8f2e6f97f34549dd02bdde7fac862dc6c0e50208a1e2e58a0981093c6c1ecd6c6d47a162c3e9696aca322a0a6bab68ec216b662a2faf1934abfa73fb685b4091586da579f73925f772436070c09b9444fceb479c80f26fcb2d531d8b81db270cb3d808ae975b803e8faadb4b787449a7be18535085c7061d733e3c630fd4cb470c5cd5eb66260013de0ad9deb35bb827f131ed4322c38fa5f9bd2aa1e9317a138279328eabf02dd9bb1d52da41fda6f2eb58684140d02a6ec1300037c57332cd313fa3449435117c43a42167f1f3b56a157a7e0cd9c9cddbdc90fa4b254264920a51c1b0afe7e6eb6ffd3b9987fbed5c99db890a00b9a73d5eb8576d51ea65905b7d81b2b0abd56d300bd4447933bff951be0b7a8c6e4b9c67e2472a7ffbe5b868672049f0412fc7ceef88331a061d7b5a400328af91ee124bf82c8eacb19cda74cb3515d71b7dc303e62d5cc47dcbdcda8de9856dbe6313c7d6023149bb239bb0b1aad9dc3a34725ee2133bba0105df113f13cec80f63d64c738a246aa817075eed58b9bb85568d788251990f24d10d387548c3bc80dea335ba5fe4bb5fe4778bd29ec20429df0d7051cef340ab48bdafd8d75e6d348b9cf9f531360c2557bd6c32a6edd96059f20a2efbeb7f528ff9711a5981191e3263f815f8aa3cc88329755287f0b05627870dbfe2802fb81da60da05ab882d4c35ec69a0c3fb6224a964d1fb4055be66f5f589921fd1c0bfcb1b2471eb34700486c3c6e90ea47cba9b15156debbbc8e722c33c055a54a53c041d281492dfeac2bceca1d5134746c54fd9d9ba15512876ef5c5ac13932b440789235f9534946c3c19325fbffc958dadcbd6da15fced266ba1b007967eb64310088f8ba4e5d8f58ac1805daff7b8c0e7ba56db986c6fdde97240a8a4c9fae8c9a70d07eb020c50bbd81d39123839e1da3ca8b48db727592ef0291c487a4a4630b94c8fa98b32b778dfb45edc1b4b03eb6d16319947d0f5ae9ec724fece1daabbfa5d9e367420f138c284891b358c4cedca05ea9a6e8735e3dbf46815f2da87bdc191c450488dc199af6f23be6ec2e2ecc5ed6420d2aa0bd5a14760133491523a2a548c6ceadc2fb8a7ca172505fe6091d741d6634ac49f67fffd0c1b7dbe1b9375a168034af9e261554c0b8301f8eac5304d6a1d07eace717336770140b1a1869e1f3f3961430b586aed860c61e2e9ada3c52af91808efc9caa570f5167934c778ca45a9de6c2cb56e72ffbd95a613a9218bfc2d76d348bf01b133267f3fb315f9a8c2d3737261b7fd3fdb7b50d08d02084d93933118b9d85d78d42762b3c0242010320e13b31f58f3ff4f3356f87fc7cc7c023c3686bc0dd952a58b8da9f54115ed56281078bdab595e55f6f81738f574614bde5c0c1504d097795c3889efe2bc9c9b4a12abda52ace46b40242639c33e7627df22baea089f02dcad245733764bad1cc967a1a8f499fb255e8daf4597200723c5af840b21eef9be7d22bc391486064effbf0875040a87d5190e318562b4894cbe4106376708c26463a31d8495bfa6c971228df864fff3d61963d4387ca6360a3736d05c803c4c95a7e23cf4967f99f386fd82c64b026b11ab4f06d536b50b86d4bb5e4a891671ffb4d7c881c4907615b63a6cb5ec75484bb5c696919d621ea0e130061c6d3379f8688628487aa0da62b444088115ba2361ff3273c9d289967d39eefd8b985d97f759cfc45b298d90060f44bf756be5f70ec639c27973709200f858828e378a50ccb3bb3ffbad01c2b9c6f663ea4fbb810691afec9ed183d899b3fb14d0864be1dbdb8e9c02b7ad76f4d59cceaf353a22cf121307002e2483e1ef0998825422cedd18edb42d72fb5ba01811ff313544f2a8d2923e9d1214bdd3e07d23181f586944ae141ca1f2968db5ef399902af2af7a96e583d4d184823624fb64f6da9fb318f022814c7da2e5f45e3c98fc0030f1637a1aa3ae94834021a8dcbdc6709f715b8e3197666ee41c2c66a35e357f14516c0df05a172b228c6460ad86a8bdcacbef73487826d5c3b65d4f5349c39184f6f8ff991abf1cda2177fba14ced63dea3680fdf57be1d551ad7b3486922ed80dd70c9961ddae220c3b6b35981fda19b8a643a7d92ddc523ce05ac9e8929437772a41dad661cc1400ea638e88ebcbc4db93d5e9edb14a1acfbedd9ec1494ae8f79877c881469aebe2faddca6e31b39c3d4e37b20aa8487d62783672fc20ec33a3f030f3b536d4877ad9c205914831937d55ff5e66f88ddef2122bb3cd05e9c1b611efa55b7b1bcd5afd71e767372481f880e1f134dc53ffbb5ca24dad5d7b8c8fa80247e1e6f7d2c2bfc4fa15df57fc601ee8db4e1ed580e37d7eb1bb0067d567870d0829fbb3809a3cf0ce4742404c6422483502c9fbbf16409e694dfc4445e87af65df8c559d4cdc35d2eda76b800c72d4bbd275c2a367f280553c71f446ce19e1a733201df28cc17362bd97c2326cf49b44768a347d391a4792b9b253be37ceea741b7f48f74220e0093c75f689509ff43e4b9bb13ab3e95fbb664b119f8f720eec6ef86dca72ed6331419694a324500d883a3cf3213f02c7bec1054932ad25a9db041fcd81faf37159047287e25cf1353dcff017a193ab29d25645924d9f161a4a97cdf63a6aed7f3fa34f08e250d5cb1135a289989f75911573f9b164588babe097b0e80794997b5a11ba7ef6af66382b0598c4c011a4f1ec616fabf51e447d3f4b34e850f940e4eb4155b823f397dfd222ee202614642bb159fc53c33bfc3c804373fff96a59790de4b2b8904d14bcc6ecbcb38938406edababd4b3bef51d4f497027b228e85af8f85933a347ba6c4261c4ad430ae7140a1abab2ac871ba2d66b41d151714ea53e8c7c30c6a8231a446a7941a6b7a838a19f5e89d6488aa98b503d6038d7ce4c1ac2dc63bf9832d1be3b46c62a70eaf28da1aa7e0a72a453d04a5f70fd80af42084891583e4c393933efc5dd03236755471a6f1597981ddd0b8bd1f63f24f34acb5798d1a60bcf69a11e745e2cc15490745bcc9fdf1b44f9fd3a762a1fab10506e67fdc13a7fd5fff60b2bcccebc52eb01702d32f72d13d9f5fa07d29815118ff4f7f94d850ce68ffff2f80e33ffe4735ec87929b3cfb01a568ff2700c08175373fd834b17d52b4755c740713d67394724d80d7d167d849afe225b80cef14ad9cc2909eda29d5558a46ea7ff0d4f3604791aa3a4e18373947dbfb8a6b64ea327769315ea133bb42bc456bfefc1b01059a10d5078d4894caf2030bc151f89436f0b250a564a99e00264e396954966845c65a9811aa2cd088ab1da9a0546ea489682e0d71169460c9342f89156a5434f7d7e0809791b6056bdc41fe60ab2700b78f9665923e5636d699b79b4eeb27c49c644cb75f6d291934fc7eea620ce63f232b0d4aab5edd98cc0e94532c2f0e9ab55eb23180f2988b4cab9c2a50e412a7b5aee84c9e3870cffc46a55b868a52f6da5d8d173e77b1295cbdad6d13442b4218bae9f791b22d6be726b640191b61f8261d4a859d61d9a3fb07bdd217cfb8d52a21f3c792448d85385017768128e32a323bdbd48083db3d684ea938fa9ebe7b59ea688231136722bc8c4a385eebf154fe631dbea137d7d11d3083facb2bd1d46dbaebf28258a78f832c5384fc798bd72ba12fab382f55f5954a2ed342011694178c0753737a7f7a812bfa6161aaf44bdbd6bf7cb3a4f964ac254db26b663b782aa881519fca25a3094d2ef84310e902aec3927a66bed912e7091cecc434d3a22e508918aed22f3af0acac4d3ecb510e21714570790d5e4eb912e535df4ddbe28a00a89201cbae12bd5022af6a8ef47dba502a41639196d0145cb9ed1bba379f1a230e1caa540f7a20588f3a129067a9e6612d47276cc4951ae30f452fbaac2f300bcd9e85de74975d73910c768020144b7dba9a1d5bb6478fc8b58e4d49be581c999575fbe26879d54d5fb4f8414f7697c620c9c439b64338ba5f8743f5e85bac233fc5e88ff09865b03d011631b6af2427ded6ac8ab655b7e2a2736a745bc4091ef17a44e40d166a9d99ba0be64e5b887a27b8935d7cd9bef329cdf7bb47d063a6742a383f948ebae0c076d4ea50fb35d20fd4ccbf08e4294bec4f33b72414277b77b3e978d65db6429a612d0fc661867f63b66c9d2ce01e08026841dae617cd9d83a7d37934b838202195b26925dc6fb2cb1ba87d1eb0ff2e00417324338a7c1b5836ddf842c6200884d44d292807de3ad92f99a8670b125d2b5b554fe878d0b00a586a078ded1d18ddee05a5bc21c9f94ee96802047085281847746da2473b14d2c8e89930b418bd75b3f5145c39017c899ea3c0cf00fba0ec37459539d2a636606f70850548b0b730c11d4d7189d8a5a9bec010167a7c0ebe2b7efde0c7e5a8d0c48ddd1af8cf5c1feeaabffdd31eb7c8b847d71f706f292ff4470a3d1549730a8c6e372ee7ddb585e6da9f44e85211f0542c1fc917799d6f28a1c6fba544af39903497b613c2cf65b11c528a04d8f57748ba50d6ae8e36b3f64822880d3d090c2ecb16212458b07af89053206c35a9ac2cfb0031a9454bf289c2bd6f900d2e4394868d7e60ad6078cf9060f9b24fd1b148f8f28504187605134a82680b26d30092ae2cc38215c354526e07cc3f5c87b46a58f744d914d0054d8c03f0e1e2843444ae39b3753fa987ff01949ad4b4ed7bde5e19b82cbdaa5d69c1d6e6c400660c98788f517b1989618f612bf2933de658eeb2a95d051ed972eb6780eea70e2fe28dd757498895dbc257015514b59ea2620d3abf8fd28f609f002b507736d6a8bb049305ecb4e5bcf5a4d56333c3a071f44bd5d7d7379fce16ee2389204ccf87cd6427e76f81035ae75f50127eef1fc262912c500d7d7cde5779b72861d6e99433317d306f8c28ba2ee7ff233423389b68fade6f36d54339abb508752eacc87eb6c60e4fcdf82039265cf16b2e8209c22c3c5617e64d01c59d93f3475160a72b11e718a7ee7edca6c873204135fa141282e3adc788f95354e39103ffd86479d0439662986e5d24d285d41de111ffd1b80fa3c7f4ad7c935fad5e7aedc16987e11cf9e0d47fd33716c58e573a01393ea3c7ba26c98a6012c953927edc09f779c1e13602a8b34fc023a31159403abc1650307bcc79b870b43a8c7aef3a1f32067347e0793816d1c0d9708ec42f7eeb31391de1f8ed50f03ad06b2c5c5f9a6c5cf4ecb920e69668fbcbdbef26141f33ea2145655dcb684ce021ff1d82f4d48aa381c2037c2dae93c36ee54517cefac0dc97f3b07035afff2e5b020f54d7dbb105a97684e1e9cd290170040d278de05dd80ef4223800e53e0c7d4ec4d36572a3d3cba83d05b4d0ebc1588b3b986e3d4b9ca42d839d0b84002b086869515c9fb3ec2098ab1f0187e24d41abdee18bf38ff82f0adf97b373c85fe2bbaeaf36166c4320010eaa8f71cdd721394745fe433c86ba22a1c7cef10009fea2558ca4aa64146ad472095588c6abbb121a2ed68a97c667dbeee3eb11e2aeac617c4f01eb35fae6bf2cb8a2e7be7689ca8828a1d0dc8b5d87c4594eacb56ba36f034de9bc8ff95795c853a25222099c8267ed5a523dcdc0dc24957d4a5b9ca3b52bce0871977ba9032a898ec818ce21c5127291389074ef9d1c5eea851ff1bd165015ac088a8bfb29656af9bc1a9d1d777fdbfdd158792a69a078d2d41256958e4b00f3117df6f5a079614a517d440900c8bb8ea2523f30f62854649a1f5a1ec05d0780d80439090924e15befa486610921eec74acb61e8be1d7b0effd163767b03b8aa683803c649f341d0a7d5b3b86cb7b5735cc036b1ed4e35293e987c4e00d2235adfd5af54e583db7cffdf983a62a3bc31daa48e3813b794c641b0303b3c0c330cf66cb5bad1143d9468b53ac2888f3883d9d07007bec8636e07b139dd72cd4db6c897d942e5d317bdbf7bf274f7638dfb1525f4a29d8e500250aebe39e432d38e941b0b72115bf41818a78bccc9ff3ecec3efb45338bd2f653fb842135905ff7140e28273985d382814962a5836c00a8542c3f7a1308777864ae0f89f03b2d98947f0886c4b80ce2a67f3ae8b9a7f1e5d7ecf61aa1967108426aa44b63f9e1bdbf5bd6826321af9e6ee511cf9eb2d26512bbffc8b47aa6cf84f7a9deb069bcb025f014a60ae5c62b6abaea9e0167544faf8b016613783e224791ed3ab687ce35057df362f088f55951cb54a7c140ad541e1ba2b84c18f1ed6605423a5ee1a0cc792c6a03249617bfa5e25ee7f6455a9b7e1e461fef1788700a26f5af2b378799ce44d1675b658269c90e1ad5cc30e0f8c2b842269d7bf02f2c03653965c41cd82789673d7081c9b93265206726da8cda8095fcc6039bcdf114ddc5fe21e038cb4ebee6df5e6e0b86b69c266bbd0190bb9a60923e58ef76e88d134738b8ef8ffe47cc70308ab3474c92df514b2aeea2bf3aea09f6da4ab4ace12b843f35cae24d9cd27a52c7b877417e47f4cad70be7cb966318a1c080042508b9ffe8f53847e2d73d780f60a7d6c36b1f19acb6f173db75e272f02db50887125179a65d35830f23e0589aef1165b06d04d9b4f2880f43e16c52c6cd2893555f1a941770d7d4eeeb9af7ffa2a317faaa357cf994f3b431e849c3d4827014e0acc50dd26cdd3a5ffac92757085f4caaca7d14b9706392fc9a7db5c9ad5f79fd5239d2de0a63d6793884dc288488f67df56728c57b379618c835a75c8a9192a432187654609edc48bfc6d7fc72dfabc43e462c6034b5da3f5e1375edee69ef2abf9a5669bb57c5f999323f1ee25c23647177c5e25b5e83b3c0719c3f636c6fa033d4134ca63abfaf563299a83c23f3492d594456cdab052b191b5b369028a0312d99c69f0db26e7d871d75fd6dcccc0cfadd6f303ce1c229e5b20f5b1af0a5e93c5a61710b6fffc9d3c0fb93d42f5f7217a79869cc53c8578c43ad2974358c2a392580e5eea317adb17a5ba06c4409e97afd95443f2d327faba3ac9bb2fd66c86811f0f509c30ede512adcb524651585aec1a88eaa8b1d23c600c271ee4aa21cc6ec80c6402e1ceb4920e35f729e036766e7f80078ae69e4ab388e6d3f1fec671759fae6e7a0800cb0437c72da424b17289c1fef02091be7ef4c7627628a9bdaa1dffaed78a7de6772b2451e6c4e4f84eddb95be3d2700524664ad12fa47025c6722cd9d3ef2c538e7a161a22117c2c957ee52a8874445ce9939800bf8b5d1d4bb61eb432ae85b624fe7d9ef52b9a7b903586014221bb84ac581dea371070546a98916ea1ace2f1129d36f04f08a5d0bfef066b98b256bbab34613f34b97f484a10d5e12d2c5279a62b6ccee3d2133f8025fcfedc068bd3992855d2d8832e1c8079ce78ae192fde0cf1c6433057528e8263a5dcb267ac72a806495561399f288f8e9c91913b74c0ebbb00d101aef91f93cb6896ffa9fd58f32ba20fdf424b06f9bcda4da32d774dc74f464ef6e6068bed473250341539da16ecfcc5b5e3246b95dd37f218bd4795092db507ac5c80ba36cbc1aa2aa1d819d824c4613ff248a01f0217b3ae2ec4e09bb8b1aa13b0b8d2575dedfbe997efc887029dae77af44e03fdd0cf41ee9d1e37afcdf80fd01c782485fb382e0d9dff84fa5cf7d0111236712c442fe5e169fde570a99ab9f43a18f16f7831407d00a8a6f9f4dd30451378d41039e3c8f2bb74a73691063ca7ba30ab7dbd9071a0526a999df822a10f0b9a7c919211b9db3dca3ac87f631b98c0f88e025643a9abff66240e25d1d2127756a2d7c581e2dbd1a037e42b9b96055dde0a095afcf9a115ae15ea469332627fd41b18a133402f72e90ca848ba08093d9b0f3337914edb6fce7d7290df192eebf73788909714d3248b62820e7158892b93d39f34d4e0940e1731d73611bef6f81744bdc69c10025b6ccd575f7c9d01e9204437a0094057a6e23be8e2f1c29cc59da10a39e31cc8c3ca0a35e07f5e4a8434b50e8631a658ce839d9f55b66a5bd4ec59d2c36c2486efd86549ef1a3c1e33277f0504ce83b88142c2a13ad81e1beb7e99276aa2d6b0527e9cda2ef16880176e5a33ef5488c0206bf7c38044f966a3a941022727887cafbde1337826a61b52b15d52d164b34dc6a1036462eddbe48a791ed64568ca9139a8eefe7aada0109ed7b1d2dd6f73c978e97b872edd6a5e5867d951d8c8344c61cb930ea355497a73db3c31338bb8603dc1d2eeb8ebe5515d01033aac10c56e8bdb97231de80d0b69bde33897d59a13786df16b38d46e76870cf8b67331fcf76e2260ba4bd1a80df8332af641e7a2146ca273a230602c51db87814a82d968f6ddf6701e4f63f99b34514b0a38914d6a4cd5fce8aefd798711f3f287cd14674c2fa4688fc1b8baa7c47972ec246dbe38c6ceb6b7fee699d0e6baffa7d2ff66b8a87ac08e78939dde2b50e7cd6b4981c10d7f2cf69cac70823f781c0afb424adf929909be2b27bdce213f741362d9e464d20eb6110d7ff10ccae35bd65f88b9033c156d68357e2616c9e9873d797042b6cc43e0818bf564557068f36de2cef49bd7eade515d87aa7a3b2a4aebfcd696b47398e2fa6958cb7a6ba8f50c483f1df2c29e03a06b3a83a0d99620155c7673a19cf86ea6feac2a161345d728542b076d65d4cb5dae45d829939bb2229359ac86834269e64c10eabd7a19bcc655d60c460b8b75016320aed2582e735d56a1b2d242924b935c7a590e8d9e4320f0f5c40ac77d223b113cc0ba9d8031bd67b1d1aba0389a5c3f0b3b3d26a69a9fca7931fc4d82e30c00db226ef10ccccd13ac1a426a96e4e0212cf03aa13332e7ab862111cd606495884dfcad1532b3f9aa9acf18923f6697eb7a7407dad17ab3ad3ca242a051a852d1591890ea7ece08ed6c2151220bf9d2931be8fce98d867a766340fa8574af25e78ed08c3231129a15bf77263c002215eb65ac8f186eeaa501db33b5caf0db4c0514d15589032d32c6436eb4b8849cf3be73a40ae7a8af052b8eef4e07926cd9fcdc62d980fac03bb68c214d50fe34262873c62abdddad499bdbc8b279e0e06c6f981ea9033adcb1ff2e7470abbcef2aed747ce90e77c9ff0766a956154a773edc73def0c0ef0f1476b7f981c05cd25bf4d08314ac1479a04e1c2cad349f2c5a76bdcab10fbfd0ef1281f89aff3e308465d86a4773aaf9063f07c530f6ef33999b8ce15ae871e054fa0b276800ddeb28709ba037fd5c4b28f6c2aaccc7fb61a58c5e2be88a5df59c120a99d9e759c563d82271b0d92e03c59e3af2184676b06848456c6b89947cc86e7f132cef0326872ecc449324d69ef7b3fbb78db3970a92cb9da13e97395093a4bf9f9164893fdf5bc78956ccc93e71b2bc526cc296a9e6109b565b6f0535fc0b7bc1d47100cbe02fc4f6391d393be0ec305cfe03236faf9d546a81007dc014552db7695fd5b9c5d0a6c6f1a22de6f15ddd893ab3db7f7790e5ae83292eea7ff190ba04a33de082ac42bc18a449b6a1da8a7ab070a5e22cfbe34473afa152f4e3a8bc798ad919f75ec5deb4fb56249322030457e2ebb790efd88331855e71ddc503e5e90366a7d1d259d70b9e6052bc4f26c15dc96a5731404ef92698a0333acf4eff1342d239a0770db42471e46ed9ff6e7b4d7fd878cb5e394f20b88c7667203afca9c427a155d4c696c65f540b3e7ac145c41fb12c39611c0a88cded3e72d86f76ca6f071320c75edb26f73da3dde75462b64b1b9cf40f2ef59f7dfcf9e3b6347178e88893978d00b11785447bb88eb9f32677a7a799a5b238d6ca70c827500ac85b3c4148e5464899accf2c1b6f4de225e988c38f1beef70df882d1ed4052e80120b19183e77a20de8dd81ff256d097d120820ca5b5a35a12ac3ef4bd29e8a2cf6b19f188e50f8a0a410589cb152315a0438aade1bea72e09c7ff33721ee1be4c0599950e36014b8aba3fd8b5373b224b3fe44b7f0d24f736df12e167dd74ced37bd51222af609382dc954c272dc15b64ad7533eb58ef9070e760418c7ced184a94042cb5f0ea39db1f62b7a2d79e446958ceec7b8eeaf91f2e83e154aaa828d38876da1bc06a5bd20f65e90f17fc5d0ed79f338f47be6ee970d332a5acd9de6ab19249773de8fae65fc1e22165593263fa6494bb51d07a24cdf509b5f180fee8ef8f5c2e471ef4252c1ba676e6cf644750eb90695ea5868921077419ffde670b763ab2868ccfa9f714fcf9c131bd2cdad0d92b3b3557bbb29674451c293fd0f975286a1afc4180383999c1154a8f3edf0901d25ede2fc2a40057148be13cce32603e532f59aa4889b51b00c4f8aeabecc680d7957caa273994430689585ea49610f25d01a0a12c0f7e3848720830fcd6dd95ca6dfb6cac6253bff7728aee471e63b92a85306f772e85be030578e68fc7c44a833bee4c7f0bfb4208b764c9e0e9b6b07a853cba3b920f5a269f6f3ced42794ed64448fc76e4b8c6d1bafaa06b1e23be1a2011c27d02f54104736b0fd4b15bcfb628f8566f2dbdda383c596987e7b7d65e65a1cbd1c8a076e33da05abceaa3fbbf489f852c9a1bb5a6b388d31dda84ae76558a102aa862188c8967f77a37518ec0ed46c939bd9f095b32de3b5984154982e6780508a0e408cace58f2607cda2537f9671260291f673e6eac8e919bd66e07d30499c51672f54a2a592b1949e72a2781e43fcd67d5461e921a94ad6cfac97ef7559946dd9cab2303bf8bd27d5ec3439ae07578b7656056ee78271a06e18d0827087dfe0908fa887904a6b8cdd6f7fabf484d3ade7bdc6b70eb5faba645e6f07b35bb48b6848f8744a79c5c5171011b8d01746d9feeb8ab674670cae9e892195ab99956f861c33dd464f79310d0d2c32d2953fde42acf0530e2007f9b3d0b38b505702a95b48fd5acc9bc98aebfd47c77252a7df4a8c8a0a922e4c5e5a0dad6b1c5c52cc4f177d2585f9b83f367e8c588f4c1236d02b1e6111900389901b4111434e8fd1c0321843e8e86a32f9eed3e87dcf0285712e6bc9071f89d9f4d447ebc0f3c9cd0eead8556287b6f9f940275e2f5f177aedfc3cc991db13eb9d334f426d6661193045c4bfaed34674961a023eb2843202699d7f570ae9527d4cafa503cba0ac977cfc8dd2c08c718b1935b889ba92776aa123ccb00f441b8c353baf2aa3a5be12ebebffe50ea6514149930b9685e188915d762d06ccc7f5b7dc40cd9da1f053923f3cf5aebc649806d6cc3f37c35d60f3641b49f01da44690990810cd2a938bd2a3ba3d8e91e7860e59fbae3d2a3925e0614a8a7d46904ecd51cebd2bc70300efbb2a776a0395c7113fe9c9eb3ca2290361a3d4b04a597809872fa7ba5dc0bc222d1da0ce3e9bd9bd8dc9556109a481c7dcaff068faf46193d8e2a7a95b9dbb0c4b84b611c168fd809096ae110c3760b3bb480ae0eb95584fc29fa7ff16d50e8206265b9f36c23959d8096934385c067e0d7dc1ac145436880f2224951534242fd340267ec6f2e1cb8ab04971a13934269e4ddeb15bd9ede839336e76fc388e2601e36604751934ffbc5e710710d53661d6cf88cc4906c5bf8e1f80a147edf33d64df2004d6fce55f4bb5e0f156868bbb787364b4dad37d1b1b4fb0c8d34b913f3171e1608ecfc3d70f1dafc22c00fc34bc484ba86d5e0d8df8a55bd0451fb0ea991db122c76af3c0715915087ae6f87d93935001dd85bc5d823c3c036b8afc79e4495c993fe7e14a7a6a7437c1eb4459f864ac85d14bfac4f847516bd4c9a960360f4ef10e52e390f5550422d1a76f4a6f085eeb4d351610d6abec53b85393b7459aa0c16d0842ab848880787bb11f9ba9c3e9595e01f1291aab50b2bcd43af36e2f006a8afb519ea087cfbb0f7b07056f3b3b73b60c35ddae4254efa44b8c6763b5b01b659901ff84dc1cf4b266282bdbe422aecf0182a3634786ef861b06698155312199c8a1833f9289e373e59d8e318870531e9ba8bc3065df0d91b3958ceb677ebbdb2394bdff43786b6cfbdef8dcb5bb06a566acb0bcc928a0ea4d26f0dd3237193322bd7acfa0fd8273aea84b950bf485edf8cfa104d1298b48970b827418c7ddd7ae7b1efdd204aa07dead300b0c8988fc480c5259d4a3c97e949274fa17d8f9dd8be1e4ec18334e1603db61ca17b7ec41682b69b3bde7c419f8da047400fa4338536b30c04ae2bb6592a260836e7bf3d150b3d1f8b249dad778514ed74ca67d6241105f30560178907a720205e33d6d49f1b214a3d44e6260f166607081a3b986498f4948332194b5aef096f34823688f5c1569e208c4e7d85e7a5aa6af8093c81d272054e3245a8a81301e670007be833fbb627729464bd43d65854f6a2d8b2f0d14832272440afa2c0b9a36940aa1a4dd287af6fc25f6938b3d80dc2e2fa4f8a24d22d82fc2acad992f437819c8eb803ed94abed43c939f0630fd6ef567c1abe2bf214daf0e036c7f7ea7e57dc5a92de6fe91dfd2fd9de03e46e95034e02c6236fad968f9f3ba779783fe9e062067e1d9d738784be5b341d39105127720f45553ddb6ccd4a486d66972918c8869285ffbd85b56e33d376efe82adb98fe7189b61d4d2fb559c8db16a82ed07df0ce77082d9961e0aa29d3e8d9f3ab705641cd75743ec4cf73dc4807cf7a1d862e8b4b8fd18f2ebe6721ad9feca583d1864837250b96478d1b1514d154803351d81752905100cb2b276f1af6849270e0205d47dc11081f554a6f35b378ec35ab62a611675324f840b6f17750e23069fbeb4ebedf191bd5f53436f0284c26feac289eef6243a813cc17c4ec217ae1eb0e04b433acc1c35389026043f7dd75b85b7f726c62c0d051ab63143119b92a5e766c26f02454cb4fd162541ac83197b5e12e005a2ceed0a1cf27d8ce00c13df2ac260cf927187b06bb4b8b34fa6d452d01d43a52c8cd64e72fd0b996f02e544def0812167f2683379b2679467355277bdcba2b44e847de8d19f8996cb81427c5ca8eebb81ec2f511967041763ed7b8639e5576eb21058bd441c8da0be813ecc9ad3eb2cf727ad47446acf73333af1370a846f3d94b0081c1eaf33a4a3c676c02e7913a4208a3cc75bd2aa4db2f4bca53fb83082a036dcfa8473f529f68d8d6a327746d2bd5920fe9954dff49b0e6e6104a1ae6c3b8c6f889e23ba7068ce2e368b251431d74db082907927185c7c6a87184ca688f1d910ed27bb80e8f824b1d363e6ce819c33272edbc3527233a534250e045c4e13f179562d959ae1afe0552967767bb4e24eb811d9f7a92e244e906dd30a8f6bd629fb441ecc006cf891a004e9eeaa0e4964bcf476a3c42ed0fe75ba4376c5ed3562f2a00f96e045ebaf863b5191823f561e25d58cb0810ab46af09e9da26e5eb03c00cb235d09ee5187def0689e1caac1fecb218edfef1375ac4b6880cb216a27dbf46bc8a31e134808e0211a51f883858a9f7e320c35d5e294e19de8ceed261a1b3f0b2919963f31dd1bb3ee2ee791088c32776c2acff05800b7d3d0cbd2d5d8aa16993f3e71d5222e260ea61a80f5e70862bb14883bae4fa67bb5f78c5aa391f6e27da2a5c333037baea4c0878c2fceb24c8ec57a2e3a97d7591c1a9fac7f8c86044d61c61e096f7133d2d07872276545f7387d82ddcfc047bc92b14d5ed81b018203dd06d79324dfd56a5867bc8f96e727305a63dc7c547a8221ed990f32e04a474048373cf3f9546549d89d9ccdb2fee96c54518466b20c32ab09ef049a2385fe14527d0cb4c983a6b6eeb852a48570fcbfd34bb3999e65177f0793d6dcd5f2bede82e4096493bfd71b0c7544d5e9135db2c698c76d258f4301da1e10d8aa296071ddfb4d50d28dd6b289505e1c37d0ffbd49094f582846e1dbb2e12766b47b4c39b69117d28002c3827803d9c8a6f41acc8a47572db48e3a3af63b3052d7ba885aefec739f47d13df516b54a768eeca594a07946c8ce430a33994ca8314cd4103622dcf30b3b40528cea899bfb10e6a129029e70dfd23c39e2431612cf3d221fba24cad4cd1cad22899b0bf3c45c8d200fc3ddf9faedac0128abca1e689cb4fa5e83ee85ce503222432b7013a9a34fe1d53228a18227a1d53d8a894b69ab12b5ae12a5864dc55996bc51e6b4fabadf4a4e2a26ee8976f1cc216c276df617dd9cd1cdae16374df0af816a2fe81916f6469aa403358212da0ef9aeedf8db7d0448d7a84b9eefcf7cc327e2d414bb3d5767dce7e4e49f583550a966fdde44af2ad9f1e00d16b3e6af82f8084aa3bfd9a0bed580e399e395c66e5a230541955f0bae90463e3c04bce37245e7c6cdd34f518206d122557d4bd603203f82ae921211c0743cccb8391ad2e09ffc44dcf17b1977841f3b96e63cad3b778c5355c97a041787f22b0b2e045f141f30958c36f332fa8cc49f3d80149376468f60a173df8cdd686645c68c7be1a0edae7c97985f7cc14f3af6cc6dda6a5b687aff403331f222f48cbc8fd3a5f6c7d37b7678edab132636903c3de7675e92d5e8ef4227de3e129fd6f793b260efd69ac84e2a246980f338d4aff610d762893ecb8e9bd7f135d21707d3a14a9ecf8a119289b67f6d35f7bb9a9ec957407883915c950b955d88fef26ce715c7f6edec05f0951889cc79bf03bdc6ae7a7a8993b7a57efb9b0dadf6d7972adcdc190482edd7aa767ed756149be99dc044917203665223cd63cac786ed65c6003df26aac648ba03a89c0e138b7a971f708eae6f0112ebcbb37bd4c24c3a84f86fc535c71bb47e72dfee4807626ac5c4c23d6c207c153d14542ef03ba48086d3671387f354c25d0dec292b4746ee230c6e30779a32dcac30397aa7fb33f62cbd08137990e368d920f09de93fc0a8360372908db13510bb530df59c183513542b65dff73ed604f430213b45035671f951d0bdef891edca97a8fa2d20dde64b81e03</script>
  <div class="hbe hbe-content">
    <div class="hbe hbe-input hbe-input-default">
      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">
      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">
        <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span>
      </label>
    </div>
  </div>
</div>
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">
    </div>

    
    
    

      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" rel="tag"># 设计模式</a>
          </div>

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/05.%E5%BF%AB%E9%80%9F%E6%94%B9%E5%96%84%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F%E7%9A%8420%E6%9D%A1%E8%A7%84%E8%8C%83/" rel="prev" title="05.快速改善代码质量的20条规范">
      <i class="fa fa-chevron-left"></i> 05.快速改善代码质量的20条规范
    </a></div>
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/13.%E6%A1%A5%E6%8E%A5%E6%A8%A1%E5%BC%8F/" rel="next" title="13.桥接模式">
      13.桥接模式 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">zhengyidi</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">39</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">5</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">7</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/zhengyidi" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;zhengyidi" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:zhengyidi1357@gmail.com" title="Contact Me → mailto:zhengyidi1357@gmail.com" rel="noopener" target="_blank"><i class="fa fa-fw fa-envelope"></i>Contact Me</a>
      </span>
  </div>



      </div>
        <div class="back-to-top motion-element">
          <i class="fa fa-arrow-up"></i>
          <span>0%</span>
        </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">zhengyidi</span>
</div>

        








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
  <script src="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  




  
<script src="/js/local-search.js"></script>













  

  

</body>
</html>
<!-- 页面点击小红心 -->
<!-- <script type="text/javascript" src="/js/love.js"></script> -->
<!-- 鼠标悬浮 -->
<script type="text/javascript" src="/js/mouse-float.js"></script>

<!-- 鼠标点击爆炸效果 -->
<canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> 
<script type="text/javascript" src="/js/fireworks/anime.min.js"></script> 
<script type="text/javascript" src="/js/fireworks/fireworks.js"></script>
